java并发编程的艺术读书笔记(一)
1.上下文切换:时间片:cpu分配给各个线程的时间。单核处理器也支持多线程执行代码。cpu通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换。多线程不一定快,因为线程有创建和上下文切换的开销。使用Lmbench可以测试上下文切换的时长(什么时候需要看这个参...
2024-01-10Java并发编程的艺术(二)——重排序
当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此。重排序指的是编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率。重排序分类重排序分为:编译器重排序 和 处理器重排序。数据依赖编译器和处理器并不会随意...
2024-01-10Java并发编程之final域的内存语义
一.final域的重排序规则 对于final域,编译器和处理器要遵循两个重拍序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的应用,与随后初次读这个final域,这两个操作之间不能重...
2024-01-10java编程思想-java中的并发(二)
有了并发就可以同时做多件事情了。但是,两个或多个线程彼此互相干涉的问题也就出现了。如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值等诸如此类的问题。1. 不正确地访问资源考虑下面的例子,其中一个任务产生偶数,而其他任...
2024-01-10并发编程的艺术06复合&层次自旋锁
复合锁考虑下面根据观察所得出的结论:在一个队列锁中,只有位于队列前面的线程需要进行锁切换。对于队列锁和后退锁的一种平衡方案就是进入临界区的过程中只允许在队列中保持少量的等待线程(使得队列变短,队列变短了争用锁的线程就少了),若剩下的线程企图进入这个队列,则采...
2024-01-10浅析Java 并发编程中的synchronized
synchronized关键字,我们一般称之为“同步锁”,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。在用synchronized修饰类时(或者修饰静态方法),默认是当前类的Class对象作为锁的对象,故存在着方法锁、对象锁、类锁这样的概念。一、没有设置线程同步的情况先给出以...
2024-01-10Java并发编程:任务的取消和关闭
要使任务和线程能安全、快速、可靠地停止下来,并不是一件容易的事。Java 没有提供任何机制来安全的终止线程。但它提供了中断,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。这种协作式的方法是必要的,我们很少希望某个任务、线程或服务立即停止,因为这种立即停止会使共...
2024-01-10关于Java 并发的 CAS
目录一、为什么要无锁二、什么是CAS?三、Java 中的CAS四、CAS存在的问题1.自旋的劣势2.ABA 问题3.尝试应用4.CAS 源码一、为什么要无锁我们一想到在多线程下保证安全的方式头一个要拎出来的肯定是锁,不管从硬件、操作系统层面都或多或少在使用锁。锁有什么缺点吗?当然有了,不然 JDK 里为什么出现...
2024-01-10【Java】Java 并发编程:AQS 的自旋锁
互斥锁在AQS的互斥锁与共享锁中已经做了详细介绍,一个锁一次只能由一个线程持有,其它线程则无法获得,除非已持有锁的线程释放了该锁。这里为什么提互斥锁呢?其实互斥锁和自旋锁都是实现同步的方案,最终实现的效果都是相同的,但它们对未获得锁的线程的处理方式却是不同的。对于互斥锁...
2024-01-10【Java】Java 并发编程:AQS 的公平性
所谓公平是指所有线程对临界资源申请访问权限的成功率都一样,它不会让某些线程拥有优先权。通过几篇文章的分析我们知道了JDK的AQS的锁是基于CLH锁进行优化的,而其中使用了FIFO队列,也就是说等待队列是一个先进先出的队列。那是否就可以说每条线程获取锁时就是公平的呢?关于公平性,严格来...
2024-01-10java并发编程专题(三)----详解线程的同步
有兴趣的朋友可以回顾一下前两篇java并发编程专题(一)----线程基础知识java并发编程专题(二)----如何创建并运行java线程在现实开发中,我们或多或少的都经历过这样的情景:某一个变量被多个用户并发式的访问并修改,如何保证该变量在并发过程中对每一个用户的正确性呢?今天我们来聊聊线...
2024-01-10Java并发编程系列之三十二:丢失的信号
这里的丢失的信号是指线程必须等待一个已经为真的条件,在開始等待之前没有检查等待条件。这样的场景事实上挺好理解,假设一边烧水,一边看电视,那么在水烧开的时候。由于太投入而没有注意到水被烧开。丢失的信号指的就是这样的情况。创建两个线程分别运行通知和等待方法,而且将运行...
2024-01-10并发编程的艺术07非阻塞同步演进
前言不知道大家有没有发现几乎每个专业领域中都充斥着很多抽象的专业名词,如果没有相关的基础知识很难知道这些专业名词是什么意思,就比如说我们的这个标题“粗粒度同步”。川建国听了想骂娘,什么是TMD“粗粒度同步”?最近我对理查德·费曼做了一些了解,他在阐述一个事物的时候强调...
2024-01-10Java 在Word文档中添加艺术字的示例
与普通文字相比,艺术字更加美观有趣也更具有辨识度,常见于一些设计精美的杂志或宣传海报中。我们在日常工作中编辑Word文档时,也可以通过添加艺术字体来凸显文章的重点,美化页面排版。这篇文章将介绍如何使用Free Spire.Doc for Java在word文档中添加艺术字并设置样式和效果。Jar包导入方法一:...
2024-01-10Java控制并发线程数的Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。以前我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以...
2024-01-10Java加密与解密的艺术 读书心得
现在项目中加密与解密的方式很多,很早就想整理一下Java中加密与解密的方式,读完<<Java加密与解密的艺术>>一书.借此机会梳理一下这方面的知识点一.基础普及 安全技术目标 安全技术目标主要包含以下五个方面: 1,保密性(Confidentiality) 保密性也被称作机密性.保密性确保数...
2024-01-10Java 常见的并发问题处理方法总结
好像挺久没有写博客了,趁着这段时间比较闲,特来总结一下在业务系统开发过程中遇到的并发问题及解决办法,希望能帮到大家 ????问题复现1. “设备Aの奇怪分身”时间回到很久很久以前的一个深夜,那时我开发的多媒体广告播放控制系统刚刚投产上线,公司开出的第一家线下生鲜店里,几十个...
2024-01-10Java 中同步集合与并发集合的区别
Java中的同步集合与并发集合在这里,我们将看到同步集合与Java中的并发集合有何不同?同步集合现在,我们将看到同步的内容是什么?在这里,同步意味着一次只允许一个线程在一个对象上操作,换句话说,该对象(已同步)不能同时被多个线程修改。同步集合可以一次由一个线程修改(即,不可能...
2024-01-10【Java】Java 并发编程:AQS 的互斥锁与共享锁
我们知道现代机器处理器几乎都是多核多线程的,引入多核多线程机制是为了尽可能提升机器整体处理性能。但是多核多线程也会带来很多并发问题,其中很重要的一个问题是数据竞争,数据竞争即多个线程同时访问共享数据而导致了数据冲突(不正确)。数据竞争如果没处理好则意味着整个业务逻辑...
2024-01-10Java并发编程之ReadWriteLock读写锁的操作方法
1.ReadWriteLock介绍为什么我们有了Lock,还要用ReadWriteLock呢。我们对共享资源加锁之后,所有的线程都将会等待。Lock读操作也锁,写操作也会锁,而对共享资源读的时候,其实是不用加锁的。当然读写同时存在的情况也会有。比如我们数据库常用操作有增删改查,增删改都是写操作,写操作必须加锁,...
2024-01-10《java学习三》并发编程 -------线程池原理剖析
阻塞队列与非阻塞队阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添...
2024-01-10java并发深入--通信、forkJoin框架、线程安全的学习
线程是计算机的一个稀缺资源,在一个应用的开发下,使用到多线程之间的使用,对项目的效率有着明显的提升;但是并不是线程越多越好,在线程的使用的时候还必须保证线程安全的前提下进行的。先前自己在学校的时候对线程总体的学习,但是始终没有用在项目上,现在打算进一步的对线程的...
2024-01-1010分钟搞定 Java 并发队列好吗?好的
| 好看请赞,养成习惯现陆续将Demo代码和技术文章整理在一起 Github实践精选 ,方便大家阅读查看,本文同样收录在此,觉得不错,还请Star前言如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类:执行者与线程池并发队列同步工具并发集合锁原子变量在并发系列中,...
2024-01-10Java并发学习之四——操作线程的中断机制
1、如果线程实现的是由复杂算法分成的一些方法,或者他的方法有递归调用,那么我们可以用更好的机制来控制线程中断。为了这个Java提供了InterruptedException异常。当你检测到程序的中断并在run()方法内捕获,你可以抛这个异常。2、InterruptedException异常是由一些与并发API相关的Java方法,如sleep()抛出的...
2024-01-10.NET Core 中的并发编程
并发编程 - 异步 vs. 多线程代码并行编程是一个广泛的术语,我们应该通过观察异步方法和实际的多线程之间的差异展开探讨。 尽管 .NET Core 使用了任务来表达同样的概念,一个关键的差异是内部处理的不同。 调用线程在做其他事情时,异步方法在后台运行。这意味着这些方法是 I/O 密集型的,即他...
2024-01-10